package com.market2.session;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.jboss.ejb3.annotation.RemoteBinding;

import com.market2.dto.MembreDto;
import com.market2.model.Membre;
import com.market2.utils.EntityManagerThreadLocal;
import com.market2.utils.Globals;
import com.market2.utils.converter.ConverterUtil;

/**
 * Session Bean implementation class MembreManager
 */

@Stateless @RemoteBinding(jndiBinding="Market2EAR/MembreManager/remote")
public class MembreManager implements MembreManagerRemote
{
	@PersistenceContext(unitName=Globals.PERSISTENCE_UNIT_NAME)
	private EntityManager entityManager;
	
	@PostConstruct
	void init() {
		EntityManagerThreadLocal.set(entityManager);
	}

	@Override
	public List<MembreDto> getAllMembres()
	{
		Query query = entityManager.createQuery("from Membre");
		
		@SuppressWarnings("unchecked")
		List<Membre> queryResult = query.getResultList();
		
		return ConverterUtil.convertFrom(queryResult, MembreDto.class);
	}

	@Override
	public MembreDto getMembreByLogin(String login)
	{
		Membre membre = entityManager.find(Membre.class, login);
		return ConverterUtil.convertFrom(membre, MembreDto.class);
	}

	@Override
	public List<MembreDto> getMembresByCriteria(Map<String, Object> criteres)
	{
		if(criteres == null) {
			return new ArrayList<MembreDto>();
		}
		
		CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
		CriteriaQuery<Membre> criteriaQuery = criteriaBuilder.createQuery(Membre.class);
		Root<Membre> from = criteriaQuery.from(Membre.class);
		
		for(String prop : criteres.keySet())
		{
			Object val = criteres.get(prop);
			
			Path<Membre> param = from.get(prop);
			Predicate condition = criteriaBuilder.equal(param, val);
			criteriaQuery.where(criteriaBuilder.and(condition));
		}
		
		CriteriaQuery<Membre> select = criteriaQuery.select(from);
		TypedQuery<Membre> typedQuery = entityManager.createQuery(select);

		List<Membre> queryResult = typedQuery.getResultList();
		List<MembreDto> result = ConverterUtil.convertTo(queryResult, MembreDto.class);
		
		return result;
	}

	@Override
	public void enregistrerMembre(MembreDto membre)
	{
		Membre newMembre = ConverterUtil.convertFrom(membre, Membre.class);
		entityManager.persist(newMembre);
		entityManager.flush();
	}
	
	@Override
	public Boolean checkLoginPassword(String login, String password)
	{
		Query query = entityManager.createQuery("from Membre inv where inv.login = :login and inv.password = :password");
		query.setParameter("login", login);
		query.setParameter("password", password);
		
		return query.getResultList().size() == 1;
	}
}
